package leetcode.递归回溯BFSDFS;

/**
 * 112. 路径总和
 *
 * 给定一个二叉树和一个目标和，
 * 判断该树中是否存在根节点到叶子节点的路径，这条路径上所有节点值相加等于目标和。
 */
public class Test112路径总和 {


    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }
    // 本问题应该注意的是要求从根节点到【叶子节点】的路径上，
    // 所以应该只能取与叶子节点相关的结果
    // 如果一个节点为 null，他的父节点可能是叶子节点，也可能是根节点，或者其他只有一个孩子的节点
    public boolean hasPathSum(TreeNode root, int sum) {

        // 防止下面出现空指针异常，提前判断一下。
        if (root == null) {
            return false;
        }
        // 真正找到叶子节点后计算结果
        if (root.left == null && root.right == null) {
            return sum - root.val == 0;
        }
        // 不然就在左右子树开始遍历寻找
        return hasPathSum(root.left, sum - root.val)
                || hasPathSum(root.right, sum - root.val);
    }
}
